package table

import (
	. "go_tempate/SQL/gormDB"
	"gorm.io/gorm"
)

// 用户信息数据表
// ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
type UserInfo struct {
	gorm.Model        // 继承公共表属性
	Name       string `gorm:"type:varchar(32);not null;comment:'用户姓名'"`
	Age        uint   `gorm:"type:int;default:0;comment:'用户年龄'"`
	Gender     int    `gorm:"type:int;default:2;comment:'性别：0女 1男 2未知'"`

	LoginInfoID int `gorm:"constraint:OnDelete:CASCADE;comment:'登录信息ID'"`
	LoginInfo   LoginInfo

	UserSecurity []UserSecurity // 用户密保问题合计
}

// 批量新增用户
// ----------------------------------------------------------------------------------------------------------
func (u UserInfo) BatchCreateUser(users *[]UserInfo) error {
	return Gorm.Create(users).Error
}

// 新增某个用户
// ----------------------------------------------------------------------------------------------------------
func (u *UserInfo) CreateUser() error {
	return Gorm.Create(u).Error
}

// 查询所有用户
// ----------------------------------------------------------------------------------------------------------
func (u UserInfo) AllUser() (*[]UserInfo, error) {
	var User = make([]UserInfo, 0)
	err := Gorm.Find(&User).Preload("LoginInfo").Preload("UserSecurity").Error
	return &User, err
}

// 使用id查询某个用户
// ----------------------------------------------------------------------------------------------------------
func (u *UserInfo) OnceUser(id uint) error {
	//进行数据库查询
	return Gorm.Where("id = ?", id).Preload("LoginInfo").Preload("UserSecurity").First(u).Error
}

// 使用loginId查询某个用户
// ----------------------------------------------------------------------------------------------------------
func (u *UserInfo) OnceLoginIdFromUser(loginId uint) error {
	return Gorm.Where("login_info_id = ?", loginId).First(u).Error
}

// 修改当前用户的信息
// ----------------------------------------------------------------------------------------------------------
func (u *UserInfo) UpdateUserInfo(name string, age uint, gender int) error {
	return Gorm.Model(&UserInfo{}).Where("id = ?", u.ID).Update("name", name).Update("age", age).Update("gender", gender).Error
}

// 修改指定id的用户信息
// ----------------------------------------------------------------------------------------------------------
func (u *UserInfo) UpdateUserInfoInId(id uint) error {
	return Gorm.Model(&UserInfo{}).Where("id = ?", id).Update("name", u.Name).Update("age", u.Age).Update("gender", u.Gender).Error
}

// 删除本用户(注意此为永久删除)
// ----------------------------------------------------------------------------------------------------------
func (u *UserInfo) DelUser() error {
	//先删除密保与用户信息对应的内容
	var userSecurity = make([]UserSecurity, 1)
	err := Gorm.Where("User_info_id = ?", u.ID).Find(&userSecurity).Error

	if len(userSecurity) != 0 {
		err = Gorm.Unscoped().Delete(userSecurity).Error
	}

	if err != nil {
		return err
	}

	//再删除用户信息
	err = Gorm.Unscoped().Delete(u).Error

	if err != nil {
		return err
	}

	//最后删除登陆内容
	err = Gorm.Unscoped().Delete(&u.LoginInfo).Error

	if err != nil {
		return err
	}

	return nil
}
